package com.mall.pay.server.controller;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.easysdk.factory.Factory;
import com.mall.common.core.domain.Result;
import com.mall.common.redis.service.RedisService;
import com.mall.order.common.po.OmsOrder;
import com.mall.pay.server.config.AlipayTemplate;
import com.mall.pay.server.config.CheckIdempotent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 支付宝接口
 */
@RestController
@RequestMapping("/alipay")
public class AliPayController {

    @Resource
    AlipayTemplate alipayTemplate;
    @Autowired
    private RedisService redisService;


    @GetMapping(value = "/pay")
    @ResponseBody
    public Result pay(String orderSn) throws AlipayApiException {
        // 获取订单对象
        String cacheObject = redisService.getCacheObject("Plan_Order:" + orderSn);
        OmsOrder omsOrder = JSONObject.parseObject(cacheObject, OmsOrder.class);
        // 调用支付宝支付模板进行支付
        String pay = alipayTemplate.pay(omsOrder);
        return Result.success(pay);
    }

    /**
     * 创建订单的方法
     *
     * @param id
     * @return
     */
    private OmsOrder createOrder(long id) {

        /**
         * 创建订单的方法
         * 因为是测试并没有创建数据库表，所以直接new了一个对象出来
         * @param id
         * @return
         */
        OmsOrder order = new OmsOrder();
        order.setId(id);  // 使用传入的id
        order.setUserId(1111111L);  // 假设用户ID固定，这里可以根据实际情况调整
        order.setInterfaceInfoId(294389472934L);  // 接口信息ID
        order.setPayAmount(BigDecimal.valueOf(1000.0));  // 订单金额
        order.setPayType("支付宝");  // 支付方式
        return order;
    }

    // 支付宝异步通知接口（用于处理支付结果）
    // 自定义注解，检查请求幂等性，防止重复支付
    @CheckIdempotent
    @PostMapping("/notify")
    public String payNotify(HttpServletRequest request) throws Exception {
        // 检查支付状态是否为成功
        if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
            System.out.println("=========支付宝异步回调========");

            // 创建一个Map对象，用于存储通知中传递的参数
            Map<String, String> params = new HashMap<>();
            // 获取请求中的所有参数
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
            }
            // 验证支付宝通知的签名是否有效
            if (Factory.Payment.Common().verifyNotify(params)) {
                // 验签通过，处理支付成功逻辑
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
                //http://localhost:9004/alipay/pay?id=110
                //查询订单号是否存在

                // 在此处进行更新订单为已支付的操作


                //添加流水表
                //iCouponService.PaymentStatementAdd(paymentFlow);
            }
        }
        // 返回支付宝确认的成功信息
        return "success";
    }

    // 注意这里必须是POST接口

    /**
     * 提取请求参数的方法
     *
     * @param request
     * @return
     */
    private Map<String, String> getRequestParams(HttpServletRequest request) {
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (String name : requestParams.keySet()) {
            params.put(name, request.getParameter(name));
        }
        return params;
    }


    /**
     * 验证签名的方法
     *
     * @param params
     * @return
     * @throws Exception
     */
    private boolean verifySignature(Map<String, String> params) throws Exception {
        return Factory.Payment.Common().verifyNotify(params);
    }


    /**
     * 记录交易详情的方法
     *
     * @param params
     */
    private void logTransactionDetails(Map<String, String> params) {
        System.out.println("交易名称: " + params.get("subject"));
        System.out.println("交易状态: " + params.get("trade_status"));
        System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
        System.out.println("商户订单号: " + params.get("out_trade_no"));
        System.out.println("交易金额: " + params.get("total_amount"));
        System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
        System.out.println("买家付款时间: " + params.get("gmt_payment"));
        System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
    }

}
